In [1]:
    
import antigravity
    
In [3]:
    
import re
    
In [4]:
    
re.match('''    # e.g. +12.34 or 12.34 or +12 or 12
        [\ ]*     # any number of space characters
        [\+\ ]?   # the plus sign '+' if available, and possible space chars
        [\d]+     # *at least* one digit
        [\.]?     # a dot '.' if available
        [\d]*     # any number of digits
        ''', '+12.34x1', re.VERBOSE).group(0)
    
    Out[4]:
In [5]:
    
re.match('''   # e.g. -12.34 or -12
        [\ ]*     # any number of space characters
        [\-]      # a minus sign '-'
        [\d]+     # one or more digits
        [\.]?     # a dot '.' if available
        [\d]*     # any number of digits
        ''', '-12.23x2', re.VERBOSE).group(0)
    
    Out[5]:
In [16]:
    
re.match('''   # e.g. +12x1 or 12x2
        [\ ]*      # any number of space characters
        [\+]?      # one + if available
        [a-z]      # one letter (variable name)
        [\d]+      # at least one digits
        ''', '+x3', re.VERBOSE).group(0)
    
    Out[16]:
In [17]:
    
re.match('''   # e.g. -12x1
        [\ ]*      # any number of space characters
        [\-]       # one minus sign
        [a-z]      # one letter(variable name)
        [\d]+      # at least one digit
        ''', '-x4', re.VERBOSE).group(0)
    
    Out[17]:
In [6]:
    
def parse_coefficients(coefficient_list, monomial):
    """
    :rtype : None
    :param coefficient_list: List in which coefficients will be stored
    :param monomial: A string (e.g. -3x1) which will be parsed to its coefficient (e.g. -3)
    """
    import re
    # Check which pattern matches. Valid are: (s)(n)lv
    #   parenthesis indicate optional existence
    #   s is + or - (absence means +)
    #   n is a number (coefficient, absence means 1)
    #   l is a lowercase latin letter (variable letter)
    #   v is a number, probably incremental (variable number)
    if re.match('''    # e.g. +12.34 or 12.34 or +12 or 12
        [\ ]*     # any number of space characters
        [\+\ ]?   # the plus sign '+' if available, and possible space chars
        [\d]+     # *at least* one digit
        [\.]?     # a dot '.' if available
        [\d]*     # any number of digits
        ''', monomial, re.VERBOSE):
        float_cast = float(re.match('[ ]*[\+ ]?[\d]+[\.]?[\d]*', monomial).group(0))
        coefficient_list.append(float_cast)
    elif re.match('''   # e.g. -12.34 or -12
        [\ ]*     # any number of space characters
        [\-]      # a minus sign '-'
        [\d]+     # one or more digits
        [\.]?     # a dot '.' if available
        [\d]*     # any number of digits
        ''', monomial, re.VERBOSE):
        float_cast = float(re.match('[ ]*[\-][\d]+[\.]?[\d]*', monomial).group(0))
        coefficient_list.append(float_cast)
    elif re.match('''   # e.g. +12x1 or 12x2
        [\ ]*      # any number of space characters
        [\+]?      # one + if available
        [a-z]      # one letter (variable name)
        [\d]+      # at least one digits
        ''', monomial, re.VERBOSE):
        coefficient_list.append(1)
    elif re.match('''   # e.g. -12x1
        [\ ]*      # any number of space characters
        [\-]       # one minus sign
        [a-z]      # one letter(variable name)
        [\d]+      # at least one digit
        ''', monomial, re.VERBOSE):
        coefficient_list.append(-1)
    
In [9]:
    
import re
input_filename = '/home/tho/data_input_file'
output_filename = '/home/tho/data_output'
# Initialize error variable
#   If error != 0 then there was a file input problem
error = 0
try:
    infile = open(input_filename)
except FileNotFoundError:
    error = 1
    print('\nInput file error: File not found.')
lines = []
if error != 1:
    for line in infile:
        lines.append(line)
    infile.close()
for line in lines:
    print(line, end='')
    
    
In [10]:
    
# Check if problem is max or min
minmax_line = ''
for line in lines:
    if re.match('^[ ]*max|min', line):
        minmax_line = line
minmax = 0
objective_function = ''
if re.match('^[ ]*max', minmax_line):
    minmax = 1
    objective_function = minmax_line
    objective_function = objective_function.strip('max')
elif re.match('^[ ]*min', minmax_line):
    minmax = -1
    objective_function = minmax_line
    objective_function = objective_function.strip('min')
if minmax_line == '' and minmax == 0:
    error = 2
    print('\nInput file error: Objective function not found.')
    
# Fill c-vector with objective function coefficients
c_vector = []
regex = re.compile('^[\+\- ]?[\d]*[\.]?[\d]*[a-z][\d+]')
while regex.match(objective_function):
    monomial = regex.match(objective_function).group(0)
    parse_coefficients(c_vector, monomial)
    objective_function = objective_function.replace(monomial, '', 1)
# Fill A-matrix, b-vector and Eqin using problem constraints
a_matrix = []
b_vector = []
eqin = []
st_line = ''
st_index = 0
for index, line in enumerate(lines):
    if 'st' in line:
        st_index = index
        st_line = line
if re.match('^[ ]*st', st_line):
    st_line = st_line.replace('st', '  ', 1)
if st_line == '':
    error = 3
    print('\nInput file error: Constraints line not found. No \'st\' keyword.')
while st_index < len(lines) - 1:
    sub_a_vector = []
    a_matrix.append(sub_a_vector)
    while True:
        st_line = st_line.strip(' ')
        if re.match('^[\+\- ]?[\d]*[\.]?[\d]*[a-z][\d+]', st_line):
            monomial = re.match('^[\+\- ]?[\d]*[\.]?[\d]*[a-z][\d+]', st_line).group(0)
            parse_coefficients(sub_a_vector, monomial)
            st_line = st_line.replace(monomial, '', 1)
        elif re.match('^[<>=]+', st_line):
            monomial = re.match('^[<>=]+', st_line).group(0)
            if monomial == '<=':
                eqin.append(-1)
            elif monomial == '>=':
                eqin.append(1)
            elif monomial == '=':
                eqin.append(0)
            else:
                error = 4
                print('\nInput file error: Unexpected character; expected <=, >=, = but got', monomial)
            st_line = st_line.replace(monomial, '', 1)
        elif re.match('^[\d]+', st_line):
            monomial = re.match('^[\d]+', st_line).group(0)
            int_cast = int(re.match('^[\d]+', st_line).group(0))
            b_vector.append(int_cast)
            st_line = st_line.replace(monomial, '', 1)
        else:
            if not sub_a_vector:    # Evaluates true when the are empty lines among the constraints
                a_matrix.pop()
            break
    # Increment line number and get the next one
    st_index += 1
    st_line = lines[st_index]
    # Search for final statement and no errors
    if st_line == 'end\n' and error == 0:
        print('\nFile input successful.')
        break
    
    
In [11]:
    
# Convert constraints to dual equivalents
#  '*' means free
variable_constraints = []
if minmax == -1:
    for el in eqin:
        if el == 0:
            variable_constraints.append('*')
        elif el == 1:
            variable_constraints.append('>=0')
        elif el == -1:
            variable_constraints.append('<=0')
    
In [12]:
    
a_matrix
    
    Out[12]:
In [20]:
    
# Transpose A-matrix
a_matrix = list(zip(a_matrix))
    
In [18]:
    
a_matrix
    
    Out[18]:
In [23]:
    
# min(max) problem's dual is max(min)
minmax = -minmax
# Write problem to output file
outfile = open(output_filename, 'w')
outfile.write('(Objective Function) b-vector: [' + ', '.join(map(str, b_vector)) + ']\n')
outfile.write('\nA-matrix: [')
thing = ''
for index, sub_a_vector in enumerate(a_matrix):
    thing += '[ ' + ', '.join(map(str, sub_a_vector)) + ']'
    if index != (len(a_matrix) - 1):
        thing += ', '
outfile.write(thing + ']\n')
outfile.write('\n(Contraints) c-vector: [' + ', '.join(map(str, c_vector)) + ']\n')
outfile.write('\n(Variable Contraints) variable_constraints-vector: [' + ', '.join(map(str, c_vector)) + ']\n')
outfile.write('\nEqin: [' + ', '.join(map(str, eqin)) + ']\n')
outfile.write('\nMinMax: [' + str(minmax) + ']\n')
outfile.close()
print('\n===Results===')
print('c-vector:', c_vector)
print('A-matrix:', a_matrix)
print('b-vector:', b_vector)
print('Variable-contraints-vector:', variable_constraints)
print('Eqin:', eqin)
print('MinMax:', minmax)